/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ile.DAO;
import java.util.List;
import javax.persistence.EntityManager;

/**
 *Inserta, modifica y elimina objetos de la base cde datos
 *Realiza las operaciones en la base de datos
 */
public abstract class DAOAbstract<T> {
    private T instancia;
    private EntityManager entityManager;

    public DAOAbstract(T t) {
        instancia = t;
        entityManager=DataSource.getEntityManager();
    }

    public EntityManager getEntityManager() {
        return entityManager;
    }

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public T getInstancia() {
        return instancia;
    }

    public void setInstancia(T instancia) {
        this.instancia = instancia;
    }

    public void persist() throws Exception{
        this.entityManager.getTransaction().begin();
        try{
        //guarda
        this.entityManager.persist(instancia);

        //Ejecuta realmente el update (conmit)
        this.entityManager.getTransaction().commit();
        }catch(Exception e){
            if(this.entityManager.getTransaction().isActive())
                //Arreglar el error y reintentar
                this.entityManager.getTransaction().rollback();
            throw e;
        }
    }

    public void update() throws Exception{
        this.entityManager.getTransaction().begin();
        try{
        //actualiza
        instancia=this.entityManager.merge(instancia);

        //Ejecuta realmente el update (conmit)
        this.entityManager.getTransaction().commit();
        }catch(Exception e){
            if(this.entityManager.getTransaction().isActive())
                //Arreglar el error y reintentar
                this.entityManager.getTransaction().rollback();            
            throw e;
        }
    }

    public void remove() throws Exception{
        this.entityManager.getTransaction().begin();
        try{
        //elimina
        this.entityManager.remove(instancia);

        //Ejecuta realmente el update (conmit)
        this.entityManager.getTransaction().commit();
        }catch(Exception e){
            if(this.entityManager.getTransaction().isActive())
                //Arreglar el error y reintentar
                this.entityManager.getTransaction().rollback();            
            throw e;
        }
    }

    public T findById(Long id){

        //DEPENDIENDO DE LA CLASE QUE HE TENIDO RECUPERO EL ID
        return(T) this.entityManager.find(this.instancia.getClass(), id);
    }

    public abstract List<T>buscartodos();

}
